﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace HotelMgr.Models
{
    public class ShoppingCart
    {
         HotelEntities db = new HotelEntities();

        string ShoppingCartId { get; set; }
        public const string CartSessionKey = "CartId";
        public static ShoppingCart GetCart(HttpContextBase context)
        {
            var cart = new ShoppingCart();
            cart.ShoppingCartId = cart.GetCartId(context);
            return cart;
        }
        //这是一个静态方法，它允许控制器获得一个Cart对象。
        //它调用GetCartId方法从用户的Session中读取CartId。
        //GetCartId以HttpContextBase作为参数，从用户的Sission中读取CartId。
        //
        public static ShoppingCart GetCart(Controller controller)
        {
            return GetCart(controller.HttpContext);
        }
        //用房间对象作为参数，并实现将它添加到用户的购物车中的功能。
        //因为Cart表记录每种房间的数量，此方法包括“如果房间状态为可预订且购物车没有
        //该房间则添加一行，如果已经存在该房间则该房间在购物车的数量不变”这样一个业务逻辑。
        //
      
        public void AddToCart(Room room)
        {
            string roomstate = "可预订";
            var cartItem = db.Carts.SingleOrDefault(c => c.CartId == ShoppingCartId && c.RoomID == room.RoomID);
            
            if(cartItem == null&&room.RoomState.Name==roomstate)
            {
               
                //创建购物车实例
                cartItem = new Cart
                               {
                                   RoomID = room.RoomID,
                                   CartId = ShoppingCartId,
                                   Count = 1,
                                   CheckInTime = DateTime.Now
                               };
                db.Carts.Add(cartItem);
             
                
            }
            else
            {
                
            }
            
            db.SaveChanges();

        }
        //以Album ID为参数，并从用户的购物车中把它移除。
        public int RemoveFormCart(int id)
        {
            //获取购物车
            var cartItem = db.Carts.Single(cart => cart.CartId == ShoppingCartId && cart.RecordId == id);
            int itemCount = 0;
            if(cartItem!=null)
            {
                if(cartItem.Count==1)
                {
                    cartItem.Count --;
                    itemCount = cartItem.Count;

                }
                else
                {
                    db.Carts.Remove(cartItem);
                }
                //保存更改
                db.SaveChanges();
            }
            return itemCount;
        }
        //从用户的购物车中移除所有商品
        public void EmptyCart()
        {
            var cartItems = db.Carts.Where(cart => cart.CartId == ShoppingCartId);
            foreach (var cartItem in cartItems)
            {
                db.Carts.Remove(cartItem);
            }
            //保存更改
            db.SaveChanges();
        }
        //返回购物车中的房间列表
        public List<Cart> GetCartItems()
        {
            return db.Carts.Where(cart => cart.CartId == ShoppingCartId).ToList();
        }
        //返回用户购物车中的房间的总数
        public int GetCont()
        {
            int? count = (from cartItems in db.Carts
                          where cartItems.CartId == ShoppingCartId
                          select (int?) cartItems.Count).Sum();
            //如果为空返回0
            return count ?? 0;
        }
        //统计房间总价
        public decimal GetTotal()
        {
            decimal? total = (from cartItems in db.Carts
                              where cartItems.CartId == ShoppingCartId
                              select (int?) cartItems.Count*cartItems.Room.RoomPrice).Sum();
            return total ?? decimal.Zero;
        }
        //生成订单
        public int CreateOrser(Order order)
        {
            decimal orderTotal = 0;
            var cartItems = GetCartItems();
            //遍历购物车的房间，添加到订单详细
            foreach (var item in cartItems)
            {
                var orderDetail = new OrderDetail
                                      {
                                          RoomID = item.RoomID,
                                          OrderID = order.OrderID,
                                          UnitPrice = item.Room.RoomPrice.Value,
                                          Quantity = item.Count
                                      };
                //设置购物车的订单总价
                orderTotal += (item.Count*item.Room.RoomPrice.Value);
                db.OrderDetails.Add(orderDetail);

            }
            //设置订单总价
            order.ActualPrice = orderTotal;
            //保存订单
            db.SaveChanges();
            //清空购物车
            EmptyCart();
            //返回订单ID
            return order.OrderID;
        }


        public  string GetCartId(HttpContextBase context) 
        {
            if (context.Session[CartSessionKey]==null)
            {
                if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
                {
                    context.Session[CartSessionKey] = context.User.Identity.Name;
                }
                else
                {
                    //创建一个Guid
                    Guid tempCartId = Guid.NewGuid();
                    //用Cookies的形式向客户端返回tempCartId（Session）
                    context.Session[CartSessionKey] = tempCartId.ToString();
                }
                
            }
            return context.Session[CartSessionKey].ToString();

        }
        //当用户已登录，便使购物车关联用户名
        public void MigrateCart(string userName)
        {
            var shoppingCart = db.Carts.Where(c => c.CartId == ShoppingCartId);
            foreach (Cart item in shoppingCart)
            {
                item.CartId = userName;

            }
            db.SaveChanges();
        }

    }
}